package cn.yrec.rain.analysis.service.impl;

import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.yrec.rain.analysis.constant.ApiConstants;
import cn.yrec.rain.analysis.model.vo.RainStationVo;
import cn.yrec.rain.analysis.model.vo.region.RegionDataItemVo;
import cn.yrec.rain.analysis.model.vo.region.RegionDataVo;
import cn.yrec.rain.analysis.service.RemoteApiService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描述:
 *  远程调用的业务层接口实现类
 * @createDate: 2023/05/24 18:02
 * @author: yanglichen
 */
@Service
public class RemoteApiServiceImpl implements RemoteApiService {

    /**
     * 方法描述: 得到流域列表
     *
     * @param basinNameList 流域列表
     * @return 站码列表
     * @author yanglichen
     * @date 2023-05-24 18:07
     **/
    @Override
    public List<String> getStcdListByBasinNameList(List<String> basinNameList) {
        List<String> result = new ArrayList<>();
        if (basinNameList==null || basinNameList.size()==0) {
            return result;
        }
        for (String singleBasinName : basinNameList) {
            List<String> itemResult = getRainStcdBySingleRegionName(singleBasinName);
            result.addAll(itemResult);
        }
        return result;
    }

    /**
     * 方法描述: 通过单个流域名称得到范围内站码列表
     * @author yanglichen
     * @date 2023-05-24 18:14
     * @param singleBasinName 单个流域的名称
     * @return 流域内站码列表
     **/
    public List<String> getStcdListBySingleBasinName(String singleBasinName) {
        // 初始化结果集
        List<String> result = new ArrayList<>();
        // 非空判断
        if (singleBasinName == null || "".equals(singleBasinName)) {
            return result;
        }
        // 构造请求参数对象
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("basin", singleBasinName);

        // 发送请求获取数据
        String responseStr = HttpRequest.get(ApiConstants.BASIN_STCD)
                //表单内容
                .form(requestMap)
                .execute()
                .body();

        JSONObject jsonObject = JSONUtil.parseObj(responseStr);
        JSONArray jsonArray = jsonObject.getJSONArray("data");
        if (jsonArray == null) {
            return result;
        }
        List<RainStationVo> rainStationVoList = jsonArray.toList(RainStationVo.class);
        for (RainStationVo item : rainStationVoList) {
            if (item.getStcd() != null) {
                result.add(item.getStcd());
            }
        }
        return result;
    }


    /**
     * 方法描述: 通过单个流域名称得到流域对象数据(测绘的新接口)
     * @author yanglichen
     * @date 2023-05-24 18:14
     * @param singleRegionName 单个流域的名称
     * @return 流域内站码列表
     **/
    @Override
    public RegionDataVo getRegionObjByRegionName(String singleRegionName) {
        // 构造返回结果
        RegionDataVo result = new RegionDataVo();
        // 非空判断
        if (singleRegionName == null || "".equals(singleRegionName)) {
            return result;
        }
        // 构造请求参数对象
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("regionName", singleRegionName);

        // 发送请求获取数据
        String responseStr = HttpRequest.get(ApiConstants.BASIN_STCD_NEW)
                .form(requestMap)
                .execute()
                .body();

        JSONObject jsonObject = JSONUtil.parseObj(responseStr);
        // 数据非空判断
        boolean hasResult = jsonObject.containsKey("data") && jsonObject.getJSONObject("data") != null;
        if (!hasResult) {
            return result;
        }
        // 返回数据
        return jsonObject.getJSONObject("data").toBean(RegionDataVo.class);
    }

    /**
     * 方法描述: 通过单个流域名称得到流域范围内的雨量站数据
     * @author yanglichen
     * @date 2023-06-09 15:27
     * @param singleRegionName 单个的流域的站码
     **/
    public List<String> getRainStcdBySingleRegionName(String singleRegionName) {
        // 初始化结果集
        List<String> result = new ArrayList<>();
        // 非空判断
        if (singleRegionName == null || "".equals(singleRegionName)) {
            return result;
        }
        // 得到流域对象
        RegionDataVo regionObjByRegionName = getRegionObjByRegionName(singleRegionName);
        List<RegionDataItemVo> rainStations = regionObjByRegionName.getRainStations();
        // 非空判断
        if (rainStations==null || rainStations.size()==0) {
            return result;
        }
        for (RegionDataItemVo itemVo : rainStations) {
            String stcd = itemVo.getStcd();
            if (stcd == null) {
                continue;
            }
            result.add(stcd);
        }
        return result;
    }


}
